<?php

//Auxiliar para mostrar arreglos formateados
function printe($arreglo) {
    echo "<pre>";
    print_r($arreglo);
    echo "</pre>";
}
//Verifica si el parametro es un Entero.
function isInteger($n) {
    return (ctype_digit(strval($n)));
}

function signo($x) {
    if ($x > 0)
        return 1;
    return -1;
}

function sigmoidea($x) {
    return 1/(1+exp(-1*$x));
}

/*
    NUMEROS ALEATORIOS EN PHP
*/
function mt_randf($min, $max)
{
    return $min + abs($max - $min) * mt_rand(0, mt_getrandmax())/mt_getrandmax(); 
}
function lcg_randf($min, $max)
{
    return $min + lcg_value() * abs($max - $min);
}
function randf($min, $max)
{
    return $min + rand(0,getrandmax()) / getrandmax() * abs($max - $min);
}

function get_random_w($size, $max = 0.5, $min = -0.5) {
    if (!isInteger($size))
        die("Debe ingresar un entero en el size de get_random_w");
   
    $salida = array();
    for ($i = 0 ; $i < $size; $i++)
        $salida[] = mt_randf($min, $max);
    
    return $salida; 
}


/*
    save_csv - FUNCION PARA GRABAR ARCHIVOS CSV
    $filename : ubicación del archivo
    $input : matriz con los valores a grabar
*/
function save_csv($filename , $input, $replace = false) {
    if (!is_array($input))
        die('input debe ser un array');
    
    if (is_file($filename))
        if ($replace == false)
            die('Intentas sobreescribir un archivo sin permisos');
    
    $n = count($input);
    $salida = '';
    for ($i = 0 ; $i < $n; $i++) {
        $n2 = count($input[$i]);
        for ($j = 0 ; $j < $n2 ; $j++) {
            $salida .= $input[$i][$j] . ',';               
        }
        $salida = substr($salida,0, -1); //Eliminamos la ultima coma
        $salida .= "\n";
   }
   $output = file_put_contents($filename, $salida);
    if ($output === FALSE)
        echo "<p>*** NO SE PUDO GRABAR</p>";
}


/*
    read_csv - FUNCION PARA LEER ARCHIVOS CSV
    $filename : ubicacion del archivo a leer
    @return : devuelve el array con la matriz leida del archivo....
*/

function read_csv($filename) {
    if (!is_file($filename))
        die('No existe el archivo que intentas parsear con read_csv');
    
    $lineas = file($filename);
    foreach ($lineas as &$linea) {
        $linea = explode(',',$linea);
    }
    return $lineas;   
}

/*
    desviar_array - Devuelve el array con la cantidad de elementos especificados y desviado el valor indicado
    $input : matriz de entrada (seed)
    $desvio : desvio de los puntos
    $n       : cantidad de elementos a generar
*/

function desviar_array($input, $desvio, $n_final) {
    $n = count($input);

    $salida = array();

    for ($j = 0, $i = 0 ; $j < $n_final; $j++, $i++) { //recorro filas de input
        if ($i == $n) 
            $i = 0;
        
        $nc = count($input[$i]);
        $filat = array();
        for ($k = 0 ; $k < $nc; $k++) {
           //escribir linea   
           $filat[] =  $input[$i][$j] + mt_randf(-1*$desvio , $desvio);            
        }
        $salida[] = $filat;
    }
    
    //printe($salida);
    return $salida;
}

//Desvia el patron, hace lo mismo que la funcion anterior pero deja la ultima columna (Y) intacta
function desviar_patron($input, $desvio, $n_final) {
        $n = count($input);

    $salida = array();

    for ($j = 0, $i = 0 ; $j < $n_final; $j++, $i++) { //recorro filas de input
        if ($i == $n) 
            $i = 0;
        
        $nc = count($input[$i]);
        $filat = array();
        for ($k = 0 ; $k < $nc-1; $k++) {
           //escribir linea   
           $filat[] =  $input[$i][$k] + mt_randf(-1*$desvio , $desvio);
        }
        $filat[] = $input[$i][$nc-1];
        $salida[] = $filat;
    }
    
    //printe($salida);
    //die;
    return $salida;

}

/*
Producto interno/punto de 2 vectores
*/
function pdot($u, $v) {
    $nu = count($u);
    if ($nu != count($v))
        die("Producto punto inconsistente");
    
    $suma = 0;
    for ($i = 0; $i < $nu; $i++)
        $suma += $u[$i] * $v[$i];
    return $suma;
}

//Distancia euclidea entre 2 puntos n-dimensionales
// sqrt( (x1-y1)² - ... )
function distancia_euclidea($x, $y) {
		$dim = count($x);
		if ($dim != count($y))
			die('Las dimensiones de los puntos son distintas');

		$suma = 0;
		for ($i = 0 ; $i < $dim ; $i++) {
			$suma += pow($x[$i] - $y[$i],2);
		}
		return sqrt($suma);	
}
//Test echo distancia_euclidea(array(1,1,1),array(0,0,0));

//Sumar vectores 

function suma_vectores($v1 , $v2 ) {
    $n = count($v1);
    if ($n != count($v2))
        die('Suma de vectores inconsistente (?)');
    
    $vsuma = array();
    
    for ($i = 0 ; $i < $n; $i++)
        $vsuma[$i] = $v1[$i] + $v2[$i];
    return $vsuma;
}
//print_r(suma_vectores(array(1,2,3), array(0, -1 , 10) ));

//dividir un vector por una constante
function dividir_vector($v1, $alfa) {
    if (!is_array($v1) || $alfa == 0)
        die('El vector no es un vector en la division o alfa es cero');
    foreach ($v1 as & $componente)
        $componente = $componente/$alfa;
    return $v1;
}
//print_r(dividir_vector(array(1,2,3), 2 ));


//Devuelve el array sin las primeras $n posiciones
function get_n_izq($arreglo, $num) {
    $n = count($arreglo);
    if ($n == 0 || !isInteger($num) || $num > $n)
        die('El arreglo es vacio | num no es entero | num > dim(arreglo)');
    
    $salida = array();
    for ($i = 0; $i < $num; $i++)
        $salida[] = $arreglo[$i];
        
    return $salida;
}

function get_n_der($arreglo, $num) {
    $n = count($arreglo);
    if ($n == 0 || !isInteger($num) || $num > $n)
        die('El arreglo es vacio | num no es entero | num > dim(arreglo)');
    
    $salida = array();
    for ( $i=$n-1 ; $i > $num; $i--)
        $salida[] = $arreglo[$i];
        
    return $salida;
}
